package com.doitedu.hdfs.client;

import com.doitedu.hdfs.utils.MyUtils;
import org.apache.hadoop.fs.*;

import java.util.Arrays;
import java.util.List;

/**
 * @Date 2021/11/30
 * @Created by HANGGE
 * @Description TODO
 */
public class C05_List02 {
    public static void main(String[] args) throws Exception {
        // 调用共军类 返回 FileSystem
        FileSystem fs = MyUtils.getFileSystem();
        /**
         * 列出目录下所有的文件
         */
        /**
         * 参数一 指定的路径
         * 参数二  是否递归遍历   false
         * 结果是指定目录下所有的文件
         */
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), false);
        while (listFiles.hasNext()){
            // 获取每个文件
            LocatedFileStatus file = listFiles.next();
            Path path = file.getPath();  // 路径
            String name = path.getName(); // 文件名

            /*
            可以获取文件的元数据信息
              LocatedFileStatus 存储在HDFS上的文件对象
                副本个数
                物理切块大小
                文件名
                文件的大小
                文件的切块的个数
                文件每个切块所在的机器
                文件内个切块的大小
                访问时间
                修改时间
             */

            short replication = file.getReplication(); // 副本个数
            System.out.println(name+"的副本的个数是:"+replication);
            long blockSize = file.getBlockSize(); // 物理切块的大小是
            System.out.println(name+"的物理切块的大小:"+blockSize/1024/1024+"M");
            long len = file.getLen(); //文件的实际大小
            System.out.println(name+"的大小:"+len);
            // 文件切块的信息
            BlockLocation[] blockLocations = file.getBlockLocations();
            System.out.println(name+"的切块数是:"+ blockLocations.length);
            // 获取每个物理切块所在的机器   每个文件块 有三个副本
            for (BlockLocation blockLocation : blockLocations) {
                // 获取物理块信息  数组
                String[] hosts = blockLocation.getHosts();
                //将数组转换成list集合
                List<String> hostNames = (List<String>) Arrays.asList(hosts);
                long length = blockLocation.getLength(); // 物理切块的偏移量
                long offset = blockLocation.getOffset(); // 物理切块的实际大小
                System.out.println(name+"物理块所在的主机:"+  hostNames+"-"+offset +"-"+length);
            }
        }
        fs.close();
    }
}
